package com.huawei.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 使用 EasyExcel 读取 Excel 文件，返回原始 Object 类型（不强制转字符串）
 * 适用于需要保留数字、日期、布尔值等原始类型的场景
 *
 * ⚠️ 注意：
 * - 仅支持 .xlsx 格式
 * - 单元格值类型由 EasyExcel 自动解析：
 *     - 文本 → String
 *     - 数字 → Double（整数也会是 Double，如 123.0）
 *     - 日期 → LocalDateTime / Date（取决于 EasyExcel 配置）
 *     - 布尔 → Boolean
 *     - 空单元格 → 不会出现在 Map 中（本实现补为 null）
 */
public class EasyExcelObjectReader {

    /**
     * 读取 Excel，返回 List<List<Object>>
     * 每个单元格的值保持 EasyExcel 解析的原始类型（String / Double / Boolean / LocalDateTime 等）
     *
     * @param filePath .xlsx 文件路径
     * @return 表格数据，空单元格为 null
     */
    public static List<List<Object>> readToList(String filePath) {
        List<List<Object>> result = new ArrayList<>();

        EasyExcel.read(new File(filePath))
                // 使用 Map<Integer, Object> 接收每行，Object 是 EasyExcel 默认解析类型
                .registerReadListener(new AnalysisEventListener<Map<Integer, Object>>() {
                    @Override
                    public void invoke(Map<Integer, Object> rowMap, AnalysisContext context) {
                        // 计算当前行最大列索引（用于补齐中间空列）
                        int maxColIndex = rowMap.keySet().stream()
                                .mapToInt(Integer::intValue)
                                .max()
                                .orElse(-1);

                        List<Object> row = new ArrayList<>();
                        for (int colIndex = 0; colIndex <= maxColIndex; colIndex++) {
                            // 获取该列的值，不存在则为 null（表示空单元格）
                            Object value = rowMap.get(colIndex);
                            row.add(value); // 直接保留原始类型
                        }
                        result.add(row);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext context) {
                        // 读取完成
                    }
                })
                .sheet()
                .doRead();

        return result;
    }

    /**
     * 读取 Excel，返回 Object[][]
     *
     * @param filePath .xlsx 文件路径
     * @return 二维对象数组，空单元格为 null
     */
    public static Object[][] readToArray(String filePath) {
        List<List<Object>> list = readToList(filePath);

        if (list.isEmpty()) {
            return new Object[0][0];
        }

        // 计算最大列数
        int maxCols = list.stream()
                .mapToInt(List::size)
                .max()
                .orElse(0);

        // 创建并填充数组
        Object[][] array = new Object[list.size()][maxCols];
        for (int i = 0; i < list.size(); i++) {
            List<Object> row = list.get(i);
            for (int j = 0; j < row.size(); j++) {
                array[i][j] = row.get(j); // 保留原始类型
            }
            // 未填充位置自动为 null（符合 Java 数组特性）
        }

        return array;
    }
}